// 54. 螺旋矩阵
// 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
// 输出：[1,2,3,6,9,8,7,4,5]
/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
 var spiralOrder = function(matrix) {
    let top=0;
    let botton=matrix.length-1;
    let left=0;
    let right=matrix[0].length-1;
    const ans=[];
    while(left<right&&top<botton){
        for(let i=left;i<right;i++) ans.push(matrix[top][i]); // 上层
        for(let i=top;i<botton;i++) ans.push(matrix[i][right]);// 右层
        for(let i=right;i>left;i--) ans.push(matrix[botton][i]);// 下层
        for(let i=botton;i>top;i--) ans.push(matrix[i][left]); // 左层
        top++;
        right--;
        botton--;
        left++;// 四个边界同时收缩，进入内层
    }
    if(top===botton) // 剩下一行，从左到右依次添加
        for(let i=left;i<=right;i++) ans.push(matrix[top][i]);
    else if(left===right)// 剩下一列，从上到下依次添加
        for(let i=top;i<=botton;i++) ans.push(matrix[i][left]);
    return ans;   
};

// 59. 螺旋矩阵 II
// 输入：n = 3
// 输出：[[1,2,3],[8,9,4],[7,6,5]]

// 构建 n * n 的矩阵
// 确定矩阵的四个边界，它是初始遍历的边界。
// 按 上 右 下 左，一层层向内，遍历矩阵填格子
// 每遍历一个格子，填上对应的 num，num 自增
// 直到 num > n*n ，遍历结束


/**
 * @param {number} n
 * @return {number[][]}
 */
 var generateMatrix = function(n) {
    const ans=new Array(n);
    for(let i=0;i<n;i++){
        ans[i]=new Array(n);
    }
    let num=1;
    let left=0,top=0,right=n-1,botton=n-1;
    while(num<=n*n){
        for(let i=left;i<=right;i++){
            ans[top][i]=num;
            num++;
        }
        top++;
        for(let i=top;i<=botton;i++){
            ans[i][right]=num;
            num++;
        }
        right--;
        for(let i=right;i>=left;i--){
            ans[botton][i]=num;
            num++;
        }
        botton--;
        for(let i=botton;i>=top;i--){
            ans[i][left]=num;
            num++;
        }
        left++;
    }
    return ans;
};